﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace xx
{
	/// <summary>
    /// 协程Coroutine，本质是一个迭代器
    /// 具有多个返回点（yield），可以在特定时机分部执行的函数。（分成多个部分去执行）
    /// </summary>
	public class CoroutineDemo01 : MonoBehaviour {
        private IEnumerator iterator;
        private void OnGUI()
        {
            if (GUILayout.Button("启动1"))
            {
                iterator = Fun1();//不会执行Fun1()方法
            }
            if (GUILayout.Button("执行一次"))
            {
                iterator.MoveNext();
            }
            if (GUILayout.Button("启动2"))
            {
                IEnumerator iterator2 = Fun1();
                StartCoroutine(iterator2);//每帧调用一次Fun1方法
                //本质上就是在执行以上2个if，即以上两个if封装起来
            }
        }
        private IEnumerator Fun1()//当第一次调用MoveNext方法时，执行方法体。
        {
            for (int i = 0; i < 5; i++)
            {
                print(i + "----"+ Time.frameCount);
                yield return new WaitForSecondsRealtime(1f);//等待一秒
                //yield return null;//暂时退出，待调用MoveNext方法时继续执行
                //yield return 条件
                //null 或者 数字 -->等待一个渲染帧（Update一帧）
                //new WaitForSeconds(1f)等待指定时间
                //new WaitForSecondsRealtime(1f)等待指定时间（不受暂停影响即不受时间缩放影响）
                //new WaitForFixedUpdate()等待一个物理帧（FixedUpdate一帧）
                //new WaitForEndOfFrame()等待一帧结束
                //new WaitWhile(委托)——>下回分解……
                //Time.timeScale = 0;时间暂停
            }
        }

        /*
         * 练习：物体淡出用协程实现
         */
    }
}

